import base64
import pickle

from django_redis import get_redis_connection

# 登陆时触发cookie购物车数据与redis里数据合并
# user 参数是登陆是传来的， 因为是登录， 所以客户端还没有user， 必须要自己添加后传来
def merge_cart_cookie_to_redis(request, user, response):
    """
    用户点击结算或登陆后把cookie的数据合并到redis里
    数据已cookie为准， cookie有redis没有就直接添加， cookie有redis也有就已cookie为主覆盖redis里的数据（也有可能是把数据累加， 或已redis为主的情况， 这里是以cookie为主）
    1. 用户登陆， 前段发来cookie；
    2. 后端从cookie获取cookie里存储的商品信息
    3. 后端获取取该用户的redis里的购物车商品信息
    4. 处理数据并保存到redis里
    5. 清除cookie数据里的购物车数据
    6. 返回响应
    """
    cookie_str = request.COOKIES.get('cart')
    if cookie_str is not None:
        cookie_cart = pickle.loads(base64.b64decode(cookie_str.encode()))
        # 链接redis， 'cart' 是setting里设置的存储redis的库名
        redis_conn = get_redis_connection('cart')
        redis_cart = redis_conn.hgetall('cart_%s'%user.id)

        cart = {}
        # 遍历redis里的商品信息添加到新的购物车里
        for sku_id, count in redis_cart.items():
            # if  sku_id in redis_cart.items():
            #     redis_cart[sku_id] = count
            # else:
            #     redis_cart[sku_id] = count
            # 判不判断， 执行结果都一样
            #  redis取除的数字是bytes类型， 转为int类型
            cart[int(sku_id)] = int(count)
        # 遍历cookie_cart， 因为是已cookie的数据准所以cookie在后面遍历
        # 如果以redis为准，则把redis数据放在后面遍历添加redis
        selected_sku_id_list = []  #存放是否选中
        for sku_id, selected_count_dict in cookie_cart.items():
            cart[sku_id] = selected_count_dict['count']
            # 处理勾选状态
            if selected_count_dict['selected']:
                selected_sku_id_list.append(sku_id)
        # 更新redis 数据
        pl = redis_conn.pipeline()
        # 添加用户购物车商品信息
        pl.hmset('cart_%s'%user.id, cart)
        # 添加cookie里的选择商品信息
        pl.sadd('cart_selected_%s'%user.id, *selected_sku_id_list)
        pl.execute()

        # 清除cookie中的购物车数据
        response.delete_cookie('cart')
        return response
    else:
        # 如果没有cookie， 则不用更新， 直接返回
        return response
